#!/usr/bin/env node

/**
 * 音频格式转换工具
 * 帮助用户将不支持的音频格式转换为 Dify AI 支持的格式
 * 
 * 使用方法:
 * node scripts/audio-format-converter.js <input_file> [output_format]
 * 
 * 示例:
 * node scripts/audio-format-converter.js voice.ogg mp3
 * node scripts/audio-format-converter.js audio.wma wav
 */

const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');

// 支持的输入格式
const SUPPORTED_INPUT_FORMATS = [
  'mp3', 'wav', 'm4a', 'aac', 'ogg', 'wma', 'flac', 'opus', 'webm'
];

// 推荐的输出格式（Dify AI 支持）
const RECOMMENDED_OUTPUT_FORMATS = ['mp3', 'wav'];

// 音频质量设置
const QUALITY_SETTINGS = {
  mp3: {
    codec: 'libmp3lame',
    bitrate: '128k',
    sampleRate: '16000',
    channels: '1'
  },
  wav: {
    codec: 'pcm_s16le',
    sampleRate: '16000',
    channels: '1'
  }
};

function printUsage() {
  console.log(`
🎵 音频格式转换工具 - Dify AI 语音转文字优化

📖 使用方法:
  node scripts/audio-format-converter.js <input_file> [output_format]

📋 参数说明:
  input_file    输入音频文件路径
  output_format 输出格式 (可选，默认为 mp3)

🎯 支持的输入格式:
  ${SUPPORTED_INPUT_FORMATS.join(', ')}

✅ 推荐的输出格式:
  ${RECOMMENDED_OUTPUT_FORMATS.join(', ')}

📝 示例:
  node scripts/audio-format-converter.js voice.ogg mp3
  node scripts/audio-format-converter.js audio.wma wav
  node scripts/audio-format-converter.js recording.m4a

🔧 依赖要求:
  需要安装 FFmpeg: https://ffmpeg.org/download.html

💡 提示:
  - MP3 格式推荐用于语音识别
  - WAV 格式推荐用于高质量音频
  - 转换后的文件会自动优化为语音识别最佳参数
`);
}

function checkFFmpeg() {
  return new Promise((resolve) => {
    exec('ffmpeg -version', (error) => {
      if (error) {
        console.error('❌ 错误: 未找到 FFmpeg');
        console.error('请先安装 FFmpeg: https://ffmpeg.org/download.html');
        console.error('');
        console.error('Windows 安装方法:');
        console.error('1. 下载 FFmpeg: https://www.gyan.dev/ffmpeg/builds/');
        console.error('2. 解压到 C:\\ffmpeg 目录');
        console.error('3. 将 C:\\ffmpeg\\bin 添加到系统 PATH 环境变量');
        console.error('');
        console.error('macOS 安装方法:');
        console.error('brew install ffmpeg');
        console.error('');
        console.error('Linux 安装方法:');
        console.error('sudo apt update && sudo apt install ffmpeg');
        resolve(false);
      } else {
        resolve(true);
      }
    });
  });
}

function getFileInfo(filePath) {
  try {
    const stats = fs.statSync(filePath);
    const ext = path.extname(filePath).toLowerCase().slice(1);
    
    return {
      exists: true,
      size: stats.size,
      sizeMB: (stats.size / (1024 * 1024)).toFixed(2),
      extension: ext,
      supported: SUPPORTED_INPUT_FORMATS.includes(ext)
    };
  } catch (error) {
    return {
      exists: false,
      error: error.message
    };
  }
}

function convertAudio(inputFile, outputFormat = 'mp3') {
  return new Promise((resolve, reject) => {
    const inputDir = path.dirname(inputFile);
    const inputName = path.basename(inputFile, path.extname(inputFile));
    const outputFile = path.join(inputDir, `${inputName}_converted.${outputFormat}`);
    
    const quality = QUALITY_SETTINGS[outputFormat];
    let ffmpegCommand;
    
    if (outputFormat === 'mp3') {
      ffmpegCommand = `ffmpeg -i "${inputFile}" -acodec ${quality.codec} -ar ${quality.sampleRate} -ac ${quality.channels} -b:a ${quality.bitrate} -y "${outputFile}"`;
    } else if (outputFormat === 'wav') {
      ffmpegCommand = `ffmpeg -i "${inputFile}" -acodec ${quality.codec} -ar ${quality.sampleRate} -ac ${quality.channels} -y "${outputFile}"`;
    } else {
      ffmpegCommand = `ffmpeg -i "${inputFile}" -y "${outputFile}"`;
    }
    
    console.log(`🔄 正在转换: ${path.basename(inputFile)} → ${outputFormat.toUpperCase()}`);
    console.log(`📁 输出文件: ${outputFile}`);
    console.log(`⚙️  转换参数: ${ffmpegCommand}`);
    console.log('');
    
    exec(ffmpegCommand, (error, stdout, stderr) => {
      if (error) {
        console.error('❌ 转换失败:', error.message);
        reject(error);
        return;
      }
      
      // 检查输出文件是否存在
      if (fs.existsSync(outputFile)) {
        const outputStats = fs.statSync(outputFile);
        const outputSizeMB = (outputStats.size / (1024 * 1024)).toFixed(2);
        
        console.log('✅ 转换成功!');
        console.log(`📁 输出文件: ${outputFile}`);
        console.log(`📊 文件大小: ${outputSizeMB} MB`);
        console.log(`🎯 格式: ${outputFormat.toUpperCase()}`);
        console.log('');
        console.log('💡 现在可以使用转换后的文件进行语音转文字了!');
        
        resolve({
          inputFile,
          outputFile,
          outputSize: outputStats.size,
          outputSizeMB
        });
      } else {
        reject(new Error('输出文件未生成'));
      }
    });
  });
}

function showOnlineTools() {
  console.log(`
🌐 在线音频转换工具推荐:

1. Convertio (https://convertio.co/audio-converter/)
   - 支持多种格式
   - 免费使用
   - 无需安装软件

2. Online Video Converter (https://www.onlinevideoconverter.com/)
   - 简单易用
   - 支持批量转换
   - 免费服务

3. Audio Online Convert (https://audio.online-convert.com/)
   - 专业音频转换
   - 支持多种参数设置
   - 免费使用

4. Zamzar (https://www.zamzar.com/)
   - 快速转换
   - 支持大文件
   - 免费服务

💡 使用建议:
  - 选择 MP3 格式，比特率 128kbps
  - 采样率选择 16kHz 或 44.1kHz
  - 声道选择单声道（mono）
`);
}

async function main() {
  const args = process.argv.slice(2);
  
  if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
    printUsage();
    return;
  }
  
  const inputFile = args[0];
  const outputFormat = args[1] || 'mp3';
  
  // 检查 FFmpeg
  const ffmpegAvailable = await checkFFmpeg();
  if (!ffmpegAvailable) {
    return;
  }
  
  // 检查输入文件
  const fileInfo = getFileInfo(inputFile);
  if (!fileInfo.exists) {
    console.error(`❌ 错误: 文件不存在: ${inputFile}`);
    return;
  }
  
  if (!fileInfo.supported) {
    console.error(`❌ 错误: 不支持的音频格式: ${fileInfo.extension}`);
    console.error(`✅ 支持的格式: ${SUPPORTED_INPUT_FORMATS.join(', ')}`);
    return;
  }
  
  // 检查输出格式
  if (!RECOMMENDED_OUTPUT_FORMATS.includes(outputFormat)) {
    console.warn(`⚠️  警告: 不推荐的输出格式: ${outputFormat}`);
    console.warn(`✅ 推荐格式: ${RECOMMENDED_OUTPUT_FORMATS.join(', ')}`);
    console.log('');
  }
  
  // 显示文件信息
  console.log('📁 文件信息:');
  console.log(`   路径: ${inputFile}`);
  console.log(`   大小: ${fileInfo.sizeMB} MB`);
  console.log(`   格式: ${fileInfo.extension.toUpperCase()}`);
  console.log(`   输出格式: ${outputFormat.toUpperCase()}`);
  console.log('');
  
  try {
    await convertAudio(inputFile, outputFormat);
  } catch (error) {
    console.error('❌ 转换失败:', error.message);
    console.log('');
    console.log('💡 如果转换失败，可以尝试使用在线转换工具:');
    showOnlineTools();
  }
}

// 如果直接运行此脚本
if (require.main === module) {
  main().catch(console.error);
}

module.exports = {
  convertAudio,
  getFileInfo,
  SUPPORTED_INPUT_FORMATS,
  RECOMMENDED_OUTPUT_FORMATS
};
